#ifndef APIDECODING_H
#define APIDECODING_H

#include "boofergh.h"
#include "decoding.h"
/*!
 * \brief Класс ApiDecoding является аппаратно-программным интерфейсом для взаимодействия модуля mainwindow и динамической библиотеки decoding
 */
class ApiDecoding
{
public:
    ApiDecoding();
    void time_test();
    /*!
     * \brief add_to_boofer добавляет пару элементов в BooferGH *boofer;
     */
    void add_to_boofer(double x, double y);
    /*!
     * \brief clear_boofer удаляет данные из буфера (BooferGH *boofer). Векторы буфера становятся пустыми
     */
    void clear_boofer();
    void lineal_pices_mistake();
    /*!
     * \brief legendre_approx_polynom расчитывает полином методом ортогональных многочленов Лежандра по данным из BooferGH *boofer
     *
     * \param max_pow максимально допустимая степень полинома
     * \return возвращает вектор коэффициентов полинома,
     * где индекс коэффициента в векторе соответствует степени аргумента при которой стоит этот коэффициент
     */
    vector<double> legendre_approx_polynom(int max_pow);
    /*!
     * \brief least_squares_polynom расчитывает полином методом наименьших квадратов по данным из BooferGH *boofer
     *
     * \param max_pow максимально допустимая степень полинома
     * \return возвращает вектор коэффициентов полинома,
     * где индекс коэффициента в векторе соответствует степени аргумента при которой стоит этот коэффициент
     */
    vector<double> least_squares_polynom(int max_pow);
    /*!
     * \brief least_squares_with_mistake вызывает метод наименьших квадратов повышая степень,
     * начиная с первой, пока не будет достигнута допустимая ошибка аппроксимации
     *
     * \param mistake максимально допустимая ошибка аппроксимации
     * \return возвращает вектор коэффициентов полинома,
     * где индекс коэффициента в векторе соответствует степени аргумента при которой стоит этот коэффициент
     */
    vector<double> least_squares_with_mistake(double mistake);
    /*!
     * \brief least_squares_with_mistake вызывает метод ортогональных многочленов Лежандра повышая степень,
     * начиная с первой, пока не будет достигнута допустимая ошибка аппроксимации
     *
     * \param mistake максимально допустимая ошибка аппроксимации
     * \param thread_count кол-во потоков, которые будет использовать функция
     * \return возвращает вектор коэффициентов полинома,
     * где индекс коэффициента в векторе соответствует степени аргумента при которой стоит этот коэффициент
     */
    vector<double> legendre_with_mistake(double mistake);
    /*!
     * \brief squared_deviation расчитывает квадратичное отклонение для данных ГХ
     *
     * \return возвращает квадратичное отклонение
     */
    double squared_deviation();
    /*!
     * \brief correlation - расчёт корреляции между значениями полиномиальной функции и значениями входных данных
     *
     * \param polynom_values вектор коэффициентов полинома,
     * где индекс коэффициента в векторе соответствует степени аргумента при которой стоит этот коэффициент
     * \return возращает значение корреляции
     */
    double correlation(vector<double> *polynom_values);
    /*!
     * \brief approx_mistake - расчёт ошибки аппроксимации
     *
     * \param polynom_values вектор коэффициентов полинома,
     * где индекс коэффициента в векторе соответствует степени аргумента при которой стоит этот коэффициент
     * \return возвращает ошибку аппроксимации в процентах
     */
    double approx_mistake(vector<double> *polynom_values);

    vector<double> calc_polynom(vector<double> *polynom_values, vector<double> *x_values);

public:
    /// буфер для хранения градуировочных характеристик
    BooferGH *boofer;
};

#endif // APIDECODING_H
